perm filename FTPR.C[11,HE] blob
sn#688212 filedate 1982-12-06 generic text, type T, neo UTF8
/*
* eftprec.c
*
* Simple eftp receiver program; not as flexable as "eftp", but
* does Pup internet routing right.
*
* Modified by hedberg Mon Jul 26 16:23:44 1982
* Hacked up from eftpsend
* Again by Jeffrey Mogul 28 July 1982
* Cleaned it up somewhat (removed irrelevant code)
*
* Jeffrey Mogul 6 November 1981 Stanford University
*
* Synopsis:
* eftprec hostname filename [key]
*
* key is initial letter(s) of: debug, unswap
* (n.b.: "unswap" is wrt local byte order; the default
* on Vax-to-dover transfers is "swap")
*
* This program is roughly equivalent to
* "eftp xeqs" <hostname> <filename>
*/
#include <stdio.h>
#include <eftp.h>
#include <pupstatus.h>
#include <pupconstants.h>
#define BUFFERSIZE 512
#define CHAN_TIMEOUT 5*60 /* seconds */
#define DEBUG if (debug) printf
char buf[BUFFERSIZE];
/* flags */
int debug = 0;
int unswap = 0;
main(argc,argv)
int argc;
char **argv;
{ /* */
struct EftpChan ec;
struct Port remport;
int i;
int stat;
int done = 0;
int tsize;
int rsize;
FILE *locfile;
long tstart;
if ((argc > 4) || (argc < 3)) {
fprintf(stderr,"Usage: eftprec hostname filename [du]\n");
exit(1);
}
if (argc == 4) { /* key to be parsed */
char *kp = argv[3];
while (*kp) {
switch (*kp) {
case 'd': debug++;
break;
case 'u': unswap++;
break;
default: fprintf(stderr,"Unknown key: %c\n",*kp);
exit(1);
}
kp++;
}
}
if ((locfile = fopen(argv[2],"w")) == NULL) {
perror("eftprec");
fprintf(stderr,"[open failed on %s]\n",argv[2]);
exit(1);
}
ReLookup:
switch (mlookup(argv[1],&remport)) {
case OK:
DEBUG("Host:%s is ",argv[1]);
if (debug) {
PortPrint(&remport);
printf("\n");
}
break;
case NOTFOUND:
fprintf(stderr,"[Host %s name not found]\n",argv[1]);
exit(1);
case NOCHAN:
DEBUG("Waiting for free network channel\n");
sleep(30);
goto ReLookup;
case TIMEOUT:
fprintf(stderr,"[Name server did not respond]\n");
exit(1);
default:
fprintf(stderr,
"[eftprec: internal error in lookup]\n");
exit(1);
}
Restart:
#ifdef PUP__NNSO
switch(EfRecOpen(&ec, &remport, CHAN_TIMEOUT, unswap)) {
#else
switch(EfRecOpen(&ec, &remport, CHAN_TIMEOUT, !unswap)) {
#endif
case OK:
DEBUG("Open OK\n");
break;
case NOCHAN:
DEBUG("Waiting for free network channel\n");
sleep(30);
goto Restart;
case NOROUTE:
fprintf(stderr,"[Cannot get to %s from here]\n",
argv[1]);
exit(1);
}
tstart = time(0);
tsize = 0;
while (!done) {
switch(stat = EftpRead(&ec,buf,BUFFERSIZE,&rsize)) {
case OK:
tsize += rsize; /* add in OLD rsize */
if (fwrite(buf,sizeof(*buf),rsize,locfile) == 0){
fprintf(stderr,"file write failed: ");
perror("eftprec");
exit(1);
}
DEBUG("read %d bytes OK\n",rsize);
break;
case TIMEOUT:
fprintf(stderr,"[Receive timed out]\n");
exit(1);
case EFTP_ENDOFFILE:
DEBUG("Received EOF\n");
done++;
break;
case EFTP_ABORT:
fprintf(stderr,"[Abort code %o: %s]\n",
EftpAbortCode,EftpErrMsg);
exit(1);
case EFTP_WAIT:
switch (EftpAbortCode) {
case EFTPA_LONGWAIT:
DEBUG("waiting %d seconds\n",EFTPW_LWAIT);
sleep(EFTPW_LWAIT);
break;
case EFTPA_MEDWAIT:
DEBUG("waiting %d seconds\n",EFTPW_MWAIT);
sleep(EFTPW_MWAIT);
break;
case EFTPA_RECBUSY:
DEBUG("waiting %d seconds\n",EFTPW_RBUSY);
sleep(EFTPW_RBUSY);
break;
default:
fprintf(stderr,"[eftprec: internal error, ");
fprintf(stderr,"inconsistent abort code:\n");
fprintf(stderr,"status = %o\n",stat);
fprintf(stderr,"abort code = %o :%s :%s]\n",
EftpAbortCode,EftpErrMsg,PupErrMsg);
exit(1);
}
goto Restart;
case EFTP_ERROR:
fprintf(stderr,"[eftprec: EFTP protocol error]\n");
exit(1);
case EFTP_RESTART:
DEBUG("eftp restart\n");
goto Restart;
case EFTP_OUTOFSYNCH:
fprintf(stderr,"[eftprec: Sender out of synch]\n");
exit(1);
default:
fprintf(stderr,"[eftprec: internal error,");
fprintf(stderr,"status = %o\n",stat);
fprintf(stderr,"abort code = %o :%s :%s]\n",
EftpAbortCode,EftpErrMsg,PupErrMsg);
exit(1);
}
}
EfRecEnd(&ec);
tstart -= time(0);
DEBUG("time = %d, rate = %d\n",-tstart,-(tsize*8)/tstart);
exit(0);
}